package nl.saxion.saktiehuis;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.text.NumberFormat;
import java.util.List;

import nl.saxion.saktiehuis.model.Order;
import nl.saxion.saktiehuis.model.Product;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class App {

	private Saktiehuis saktiehuis;
	private String klantNaam = "";
	private int orderNummer = -1;

	public static void main(String args[]) throws IOException {
		new App();
	}

	public App() throws IOException {
		ApplicationContext appContext = new ClassPathXmlApplicationContext(
				"spring/config/applicationContext.xml");

		saktiehuis = (Saktiehuis) appContext.getBean("Saktiehuis");
		this.start();
	}

	public void start() throws IOException {
		BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
		String s;
		printHelp();
		while ((s = in.readLine()) != null && s.length() != 0) {
			// Niet erg flexibel voor nieuwe commando's maar het is toch maar
			// een Proof of Concept
			String arr[] = s.split(" ", 3);
			String command = arr[0];

			if (command.equals("help")) {
				printHelp();
			} else if (command.equals("producten")) {
				if (arr.length > 2) {
					getProducten(arr[1]);
				} else {
					getProducten(null);
				}
			} else if (command.equals("nieuw")) {
				nieuweBestelling(arr[1]);
			} else if (command.equals("bestel")) {
				bestel(arr[1], arr[2]);
			} else if (command.equals("overzicht")) {
				printOverzicht();
			} else if (command.equals("bevestig")) {
				bevestig();
			} else {
				System.out
						.println("Onbekend commando, gebruik \"help\" voor een overzicht van de beschikbare commando's");
			}
		}

	}

	private void printHelp() {
		System.out.println("Gebruik:");
		System.out.println("producten:\t\t Geeft een lijst van producten");
		System.out.println("\targumenten:");
		System.out.println("\t- Product soort, bij niet opgeven alle soorten");

		System.out.println("nieuw:\t\t Start een nieuwe bestelling");
		System.out.println("\targumenten:");
		System.out.println("\t- Klantnaam van de klant");

		System.out
				.println("bestel:\t\t Voegt een bestelling toe aan de huidige bestelling");
		System.out.println("\targumenten:");
		System.out.println("\t- Productcode van het product");
		System.out.println("\t- Aantal te bestellen producten");

		System.out
				.println("overzicht:\t\t Geeft het overzicht van de bestelde producten");

		System.out.println("bevestig:\t\t Bevestigt de huidige bestelling");
	}

	private void getProducten(String productSoort) {
		List<Product> selectie = saktiehuis.getSelectie(productSoort);
		System.out.println("Code\tbeschrijving\tsoort\tprijs");
		if (selectie != null) {
			for (Product product : selectie) {
				System.out.println(product.getId() + "\t" + product.getNaam()
						+ "\t\t" + product.getType() + "\t"
						+ convertDouble(product.getPrijs()));
			}
		} else {
			System.out.println("Geen producten gevonden");
		}
	}

	private String convertDouble(double toConvert) {
		return NumberFormat.getCurrencyInstance().format(toConvert);
	}

	private void nieuweBestelling(String klantNaam) {
		orderNummer = saktiehuis.nieuwOrder(klantNaam);
		if (orderNummer != -1) {
			this.klantNaam = klantNaam;
			System.out.println("Nieuw bestelnummer is " + orderNummer);
		} else {
			System.err.println("Kon bestelling voor klant " + klantNaam
					+ " niet maken. Bestaat deze klant wel?");
		}
	}

	private void bestel(String productCode, String aantal) {

		try {
			boolean bestellenGelukt = saktiehuis.bestel(orderNummer,
					Integer.parseInt(productCode), Integer.parseInt(aantal));
			if (bestellenGelukt) {
				System.out.println("De bestelling is gelukt! Jippie!");
			} else {
				System.err
						.println("Bestellen is niet gelukt. Is er wel een order?");
			}
		} catch (NumberFormatException e) {
			System.err
					.println("ProductCode en Aantal moeten wel een getal zijn!");
		}
	}

	private void printOverzicht() {
		if (orderNummer != -1) {
			Order order = saktiehuis.getOverzicht(orderNummer);

			System.out.println("BestelOverzicht:");
			System.out.println("klantnaam:\t" + order.getKlant().getNaam());
			System.out.println("bestelnr:\t" + order.getId());
			System.out.println("bevestigd:\t" + order.isDefinitief());

			if (order.getProducten() != null) {
				System.out.println("Producten:");
				for (Product product : order.getProducten()) {
					System.out.println("\t" + product.getId() + "\t"
							+ product.getNaam() + "\t"
							+ convertDouble(product.getPrijs()));
				}
			}
			System.out.println("Totaal bedrag:\t"
					+ convertDouble(order.getTotaalKosten()));
		} else {
			System.err.println("Maak eerst een order aan!");
		}
	}

	private void bevestig() {
		if (orderNummer != -1) {
			saktiehuis.bevestigOrder(orderNummer);
		}
	}

}
